#include "OASystemUI.h"
#include "OADataCebter.h"
#include "OAUtil.h"
#include <cstdlib>
#include <iostream>

using namespace std;

#define FLAG_ADMIN 1
#define FLAG_USER 2

/**
 * @brief 管理员主页面
 *
 * @param admin
 */
void showAdminMainPage(OAAdmin &admin) {
  OADataCebter &dataCebter = OADataCebter::getInstance();
  while (1) {
    cout << "欢迎管理员用户 " << admin.username() << endl;
    cout << "--------------------" << endl;
    cout << "1. 查看所有的普通用户" << endl;
    cout << "2. 添加一个普通用户" << endl;
    cout << "3. 删除一个普通用户" << endl;
    cout << "4. 查看所有会议室" << endl;
    cout << "5. 添加一个会议室" << endl;
    cout << "6. 删除一个会议室" << endl;
    cout << "7. 重置所有的会议" << endl;
    cout << "8. 退出登录" << endl;
    cout << "--------------------" << endl;
    cout << "请输入您的选择：";

    // 获取用户输入的选择
    int choice = OAUtil::inputNumber();
    // 获取用户的输入的信息
    string username, password, department;
    // 会议室的信息
    int mid, capacity;
    string roomname;
    // 操作是否成功
    bool is;
    switch (choice) {
    case 1:
      // 显示所有的普通用户
      dataCebter.printUser();
      break;
    case 2:
      // 添加一个普通用户
      cout << "请输入用户名：";
      username = OAUtil::inputString();
      cout << "请输入密码：";
      password = OAUtil::inputString();
      cout << "请输入部门：";
      department = OAUtil::inputString();
      is = admin.addUser(username, password, department);
      if (is) {
        cout << "普通用户添加成功" << endl;
      } else {
        cout << "普通用户添加失败" << endl;
      }
      break;
    case 3:
      // 删除一个普通用户
      cout << "请输入用户名：";
      username = OAUtil::inputString();
      is = admin.delUser(username);
      if (is) {
        cout << "普通用户删除成功" << endl;
      } else {
        cout << "普通用户删除失败" << endl;
      }
      break;
    case 4:
      // 查看所有会议室
      dataCebter.printMeetingRoom();
      break;
    case 5:
      // 添加一个会议室
      cout << "请输入会议室编号：";
      mid = OAUtil::inputNumber();
      cout << "请输入会议室容量：";
      capacity = OAUtil::inputNumber();
      cout << "请输入会议室名称：";
      roomname = OAUtil::inputString();
      is = admin.addMeetingRoom(mid, capacity, roomname);
      if (is) {
        cout << "会议室添加成功" << endl;
      } else {
        cout << "会议室添加失败" << endl;
      }
      break;
    case 6:
      // 删除一个会议室
      cout << "请输入会议室编号：";
      mid = OAUtil::inputNumber();
      is = admin.delMeetingRoom(mid);
      if (is) {
        cout << "会议室删除成功" << endl;
      } else {
        cout << "会议室删除失败" << endl;
      }
      break;
    case 7:
      // 重置所有的会议
      dataCebter.clearMeetingRoomType();
      cout << "所有会议已重置" << endl;
      break;
    case 8:
      // 退出登录
      cout << "感谢您的使用，再见！" << endl;
      // 按任意键继续
      system("pause");
      return;
    }

    // 按任意键继续
    system("pause");
    // 清屏
    system("cls");
  }
}

/**
 * @brief 用户主页面
 *
 * @param user
 */
void showUserMainPage(OAUser &user) {
  OADataCebter &dataCebter = OADataCebter::getInstance();
  while (1) {
    cout << "登录成功，欢迎 " << user.department() << " 的 " << user.username() << endl;
    cout << "--------------------" << endl;
    cout << "1. 预约一个会议室" << endl;
    cout << "2. 查看已预约的会议室" << endl;
    cout << "3. 取消已预约的会议室" << endl;
    cout << "4. 查看所有的会议室" << endl;
    cout << "5. 退出登录" << endl;
    cout << "--------------------" << endl;
    cout << "请输入您的选择：";

    // 获取用户输入的选择
    int choice = OAUtil::inputNumber();
    // 获取用户的输入的信息
    int mid;
    string username = user.username();
    // 操作是否成功
    bool is;

    switch (choice) {
    case 1:
      // 预约一个会议室
      cout << "请输入您要预约的会议室编号：";
      mid = OAUtil::inputNumber();
      is = user.reserveMeetingRoom(mid);
      if (is) {
        cout << "会议室预约成功" << endl;
      } else {
        cout << "会议室预约失败" << endl;
      }
      break;
    case 2:
      // 查看已预约的会议室
      user.printMeetingRoomByUser();
      break;
    case 3:
      // 取消已预约的会议室
      cout << "请输入您要取消的会议室编号：";
      mid = OAUtil::inputNumber();
      is = user.cancelReserveMeetingRoom(mid);
      if (is) {
        cout << "会议室取消成功" << endl;
      } else {
        cout << "会议室取消失败" << endl;
      }
      break;
    case 4:
      // 查看所有的会议室
      dataCebter.printMeetingRoom();
      break;
    case 5:
      // 退出登录
      cout << "感谢您的使用，再见！" << endl;
      // 按任意键继续
      system("pause");
      return;
    }

    // 按任意键继续
    system("pause");
    // 清屏
    system("cls");

  }

    // 按任意键继续
    system("pause");
    // 清屏
    system("cls");
}

/**
 * @brief 显示登录页面
 *
 * @param flag 1: 管理员登录 2: 用户登录
 */
void showLoginPage(int flag) {
  cout << "--------------------" << endl;
  flag == FLAG_ADMIN ? cout << "管理员登录" << endl
                     : cout << "用户登录" << endl;

  cout << "--------------------" << endl;

  cout << "请输入用户名：";
  string username = OAUtil::inputString();
  cout << "请输入密码：";
  string password = OAUtil::inputString();

  OADataCebter &dataCebter = OADataCebter::getInstance();
  if (flag == FLAG_ADMIN) {
    OAAdmin &admin = dataCebter.loginAdmin(username, password);

    if (&admin == &OAAdmin::ERROR_ADMIN) {
      cout << "用户名或密码错误" << endl;
      return;
    }
    cout << "登录成功，欢迎管理员用户 " << admin.username() << endl;
    showAdminMainPage(admin);
  } else {
    OAUser &user = dataCebter.loginUser(username, password);

    if (&user == &OAUser::ERROR_USER) {
      cout << "用户名或密码错误" << endl;
      return;
    }

    cout << "登录成功，欢迎 " << user.department() << " 的 " << user.username()
         << endl;
    showUserMainPage(user);
  }
}

void OASystemUI::dispayMainPage() {
  while (1) {
    cout << "欢迎使用OA系统" << endl;
    cout << "1. 管理员登录" << endl;
    cout << "2. 用户登录" << endl;
    cout << "3. 退出系统" << endl;
    cout << "请输入您的选择：";

    // 获取用户输入的选择
    int choice = OAUtil::inputNumber();
    switch (choice) {
    case 1:
      // 管理员登录
      showLoginPage(FLAG_ADMIN);
      break;
    case 2:
      // 用户登录
      showLoginPage(FLAG_USER);
      break;
    case 3:
      // 退出系统
      cout << "感谢您的使用，再见！" << endl;
      return;
    }
    // 按任意键继续
    system("pause");
    // 清屏
    system("cls");
  }
}